#pragma once

#include "Common.h"

/**
 * 中心缓存类 - 单例模式设计
 * 功能：
 * 1. 作为线程缓存和页缓存之间的中间层
 * 2. 管理不同大小的内存块span
 * 3. 为线程缓存提供批量内存块
 * 4. 回收线程缓存释放的内存块
 */
class CentralCache
{
public:
    // 获取单例对象(线程安全)
    static CentralCache* GetInstance()
    {
        return &_sInst;
    }

    /**
     * 从中心缓存获取一个非空的span
     * @param list 对应大小的span链表
     * @param byte_size 需要的内存块大小
     * @return 返回一个可用的span
     */
    Span* GetOneSpan(SpanList& list, size_t byte_size);

    /**
     * 从中心缓存获取一定数量的内存对象
     * @param start [输出]获取到的内存块起始地址
     * @param end [输出]获取到的内存块结束地址
     * @param batchNum 请求获取的数量
     * @param size 每个内存块的大小
     * @return 实际获取到的数量
     */
    size_t FetchRangeObj(void*& start, void*& end, size_t batchNum, size_t size);

    /**
     * 将一批内存块释放回对应的span
     * @param start 内存块链表的起始地址
     * @param byte_size 每个内存块的大小
     */
    void ReleaseListToSpans(void* start, size_t byte_size);

private:
    SpanList _spanLists[NFREELIST];  // 按大小分类的span数组，NFREELIST=208

private:
    // 单例模式构造方法
    CentralCache() = default;
    
    // 禁止拷贝构造
    CentralCache(const CentralCache&) = delete;

    static CentralCache _sInst;  // 单例对象
};